package com.hsu.apibackend.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hsu.apibackend.model.entity.ProductOrder;
import com.hsu.apibackend.model.vo.ProductOrderVO;
import com.hsu.apibackend.model.vo.UserVO;

import javax.servlet.http.HttpServletRequest;

/**
 * @Author Hsu琛君珩
 * @Date 2024-09-09 19:42
 * @Description 产品订单服务接口，定义了产品订单的相关操作方法。
 * @Version: v1.0.0
 */
public interface ProductOrderService extends IService<ProductOrder> {

    /**
     * 保存产品订单
     *
     * @param productId 产品ID
     * @param loginUser 登录用户
     * @return {@link ProductOrderVO}
     */
    ProductOrderVO saveProductOrder(Long productId, UserVO loginUser);

    /**
     * 更新产品订单
     *
     * @param productOrder 产品订单对象
     * @return 是否更新成功
     */
    boolean updateProductOrder(ProductOrder productOrder);

    /**
     * 获取产品订单
     *
     * @param productId 产品ID
     * @param loginUser 登录用户
     * @param payType   支付类型
     * @return {@link ProductOrderVO}
     */
    ProductOrderVO getProductOrder(Long productId, UserVO loginUser, String payType);

    /**
     * 根据订单号更新订单状态
     *
     * @param outTradeNo 订单号
     * @param orderStatus 订单状态
     * @return 是否更新成功
     */
    boolean updateOrderStatusByOrderNo(String outTradeNo, String orderStatus);

    /**
     * 根据订单号关闭订单
     *
     * @param outTradeNo 订单号
     * @throws Exception 如果关闭失败抛出异常
     */
    void closedOrderByOrderNo(String outTradeNo) throws Exception;

    /**
     * 根据订单号获取产品订单
     *
     * @param outTradeNo 订单号
     * @return {@link ProductOrder}
     */
    ProductOrder getProductOrderByOutTradeNo(String outTradeNo);

    /**
     * 处理超时订单
     *
     * @param productOrder 产品订单对象
     */
    void processingTimedOutOrders(ProductOrder productOrder);

    /**
     * 处理支付通知
     *
     * @param notifyData 支付通知数据
     * @param request    请求对象
     * @return 处理结果
     */
    String doPaymentNotify(String notifyData, HttpServletRequest request);
}
